#ifndef RECURSODEALMACENAMIENTO_H_
#define RECURSODEALMACENAMIENTO_H_

#include "../Constantes.h"
#include "../Bytes.h"

class EstrategiaAlmacenamiento;
class Almacenamiento;
class EstrategiaRecurso;
class Objeto;
class Buffer;
class Archivo;
class IteradorRegistrosFijos;
class Iterador;
class TipoClave;
class FabricaCompuestos;

class RecursoDeAlmacenamiento {

	friend class EstrategiaAlmacenamientoBloques;
	friend class EstrategiaAlmacenamiento;
	friend class EstrategiaAlmacenamientoRegistro;
	friend class IteradorRegistrosFijos;
	friend class IteradorBloques;
	friend class IndiceHash;
	friend class FabricaRecursosAlmacenamiento;
	friend class IndiceSecuencial;

protected:

	EstrategiaAlmacenamiento* estrategiaAlmacenamiento;
	EstrategiaRecurso* estrategiaRecurso;
	FabricaCompuestos* fabrica;

	RecursoDeAlmacenamiento(EstrategiaAlmacenamiento*,EstrategiaRecurso*);

public:
	virtual ~RecursoDeAlmacenamiento();

	/*
	 * Pre: -
	 * Pos: Devuelve el tamanio del archivo.
	 */
	offset getTamanioArchivo();

	/*
	 * Pre: -
	 * Pos: Guarda el contenido.
	 */
	virtual offset guardar(Bytes dato, long numComponente = -1);

	/*
	 * Pre: -
	 * Pos: Devuelve true si el archivo esta vacio.
	 */
	bool estaVacio();

	/*
	 * Pre: -
	 * Pos: Devuelve el iterador del recurso.
	 */
	Iterador* getIterador();

	/*
	 * Pre: -
	 * Pos: Devuelve el path del archivo.
	 */
	string getPath();

	/*
	 * Pre: -
	 * Pos: Inicializa el recurso.
	 */
	virtual void inicializar();

	/*
	 * Pre: -
	 * Pos: Imprime lo que almacena el Buffer.
	 */
	void imprimirBuffer();

private:

	void escribir(const Bytes& bytes, offset offset);
	Bytes leer(offset offset, cantBytes cantBytes);
	bool setTamanioArchivo(cantBytes tamanioNuevo);
};

#endif /* RECURSODEALMACENAMIENTO_H_ */
